package com.qq.weixin.mp.aes;

import com.zzb.weixin.exception.WeiXinException;

public class WeiXinBizHelper {
	private WXBizMsgCrypt bizMsgCrypt = null;
	private String token = null;

	/**
	 * 构造函数
	 * 
	 * @param token
	 *            公众平台上，开发者设置的token
	 * @param encodingAesKey
	 *            公众平台上，开发者设置的EncodingAESKey
	 * @param appId
	 *            公众平台appid
	 * 
	 * @throws WeiXinException
	 *             执行失败，请查看该异常的错误码和具体的错误信息
	 */
	public WeiXinBizHelper(String token, String encodingAesKey, String appId)
			throws WeiXinException {
		try {
			bizMsgCrypt = new WXBizMsgCrypt(token, encodingAesKey, appId);
			this.token = token;
		} catch (AesException e) {
			e.printStackTrace();
			throw new WeiXinException(e.getCode() + "", e.getMessage());
		}
	}

	/**
	 * 检验消息的真实性，并且获取解密后的明文.
	 * <ol>
	 * <li>利用收到的密文生成安全签名，进行签名验证</li>
	 * <li>若验证通过，则提取xml中的加密消息</li>
	 * <li>对消息进行解密</li>
	 * </ol>
	 * 
	 * @param msgSignature
	 *            签名串，对应URL参数的msg_signature
	 * @param timeStamp
	 *            时间戳，对应URL参数的timestamp
	 * @param nonce
	 *            随机串，对应URL参数的nonce
	 * @param postData
	 *            密文，对应POST请求的数据
	 * 
	 * @return 解密后的原文
	 * @throws WeiXinException
	 * @throws AesException
	 *             执行失败，请查看该异常的错误码和具体的错误信息
	 */
	public String decryptMsg(String msgSignature, String timeStamp,
			String nonce, String postData) throws WeiXinException {

		try {
			// 验证安全签名
			String signature = SHA1.getSHA1(token, timeStamp, nonce, postData);

			// 和URL中的签名比较是否相等
			// System.out.println("第三方收到URL中的签名：" + msg_sign);
			// System.out.println("第三方校验签名：" + signature);
			if (!signature.equals(msgSignature)) {
				throw new AesException(AesException.ValidateSignatureError);
			}

			// 解密
			String result = bizMsgCrypt.decrypt(postData);
			return result;
		} catch (AesException e) {
			e.printStackTrace();
			throw new WeiXinException(e.getCode() + "", e.getMessage());
		}
	}
}
